HTMLify

quiz.js
Views: 49 | Author: cody
let id = (id) => document.getElementById(id);
let classes = (classes) => document.getElementsByClassName(classes);
let queryselector = (query) => document.querySelector(query);

let questionNumber = 0, quiztimer, questionTimer;
let questionAnswersGiven = 0;

// for converting b64 to utf8
function b64_to_utf8(str) {
    return decodeURIComponent(escape(window.atob(str)));
}

// to check answer
let checkAnswer = (answerGiven, rightAnswer, options) => {

    if (answerGiven === b64_to_utf8(rightAnswer)) {
        id(answerGiven).style.background = "#228B22";
        id(answerGiven).style.color = "#fff";
        questionAnswersGiven++;
    } else {
        if (answerGiven) {
            id(answerGiven).style.background = "#FA8072";
            id(answerGiven).style.color = "#fff";

        }
        
        options.map(option => {
            if (option === b64_to_utf8(rightAnswer)) {
                try{

                    id(option).style.background = "#32CD32";
                    id(option).style.color = "#fff";
                }
                catch(err){
                    console.log(err);
                }
            }
        });
    }
}


// redering data of question
let renderQuestion = (questionDetail) => {
    id("question").innerHTML = questionDetail.question;
    let radioOption = id("radio-options");
    radioOption.innerHTML = "";

    // rendering radio option
    questionDetail.options.map((option) => {
        let Div = document.createElement("div")
        Div.setAttribute("id", option);
        let RadioButton = document.createElement("input");
        RadioButton.setAttribute("type", "radio");
        RadioButton.setAttribute("name", "answer");
        RadioButton.setAttribute("value", option);
        RadioButton.setAttribute("class","form-check-input");

        let Label = document.createElement("label");
        Label.innerHTML = option;
        Label.setAttribute("class","form-check-label");

        Div.appendChild(RadioButton);
        Div.appendChild(Label);
        radioOption.appendChild(Div);

    });

}

// displaying initial data
let displayInitialData = (quizChosen) => {
    id("quiz-title").innerHTML = quizChosen.title;
    let date = new Date(quizChosen.createdAt);
    date = new Date(date.getTime());

    id("created-at").innerHTML = date;
    id("quiz-time").innerHTML = `1. Max time to solve quiz is ${quizChosen.totalTime} sec`;
    id("drop-down-quiz-time").innerHTML = `1. Max time to solve quiz is ${quizChosen.totalTime} sec`;
    id("question-time").innerHTML = `2. Max time to solve one question is ${quizChosen.timePerQuestion} sec`;
    id("drop-down-question-time").innerHTML = `2. Max time to solve one question is ${quizChosen.timePerQuestion} sec`

    classes("container-box")[0].style.display = "flex";


    let remainingtimeForQuiz = quizChosen.totalTime;

    // timmer for quiz
    let checkTimeForQuiz = () => {
        if (remainingtimeForQuiz === 0) {

            if (questionNumber < quizChosen.data.length) {
                
                let answerGiven = queryselector("input[name='answer']:checked");
                if (answerGiven) {
                    answerGiven = answerGiven.value;
                }
                checkAnswer(answerGiven, quizChosen.data[questionNumber].answer, quizChosen.data[questionNumber].options);
                
            }

            console.log(questionAnswersGiven);
            sessionStorage.setItem("questionanswersGiven", questionAnswersGiven);
            window.location = "result.html";
        } else {
            remainingtimeForQuiz--;
            id("quiz-time-left").innerHTML = remainingtimeForQuiz;
            quiztimer = setTimeout(checkTimeForQuiz, 1000);
        }
    }

    let remainingTimeForQuestion = quizChosen.timePerQuestion;

    // timmer for question
    let checkTimeforQuestion = () => {
        if (remainingTimeForQuestion === 0) {
            let answerGiven = queryselector("input[name='answer']:checked");
            if (answerGiven) {
                answerGiven = answerGiven.value;
            }
            if(questionNumber<quizChosen.data.length-1){
                remainingTimeForQuestion = quizChosen.timePerQuestion;
            }
            
            checkAnswer(answerGiven, quizChosen.data[questionNumber].answer, quizChosen.data[questionNumber].options);
            classes("submit")[0].classList.add("disabled");
            classes("next")[0].classList.remove("disabled");
            questionNumber++;

        } else {

            id("question-time-left").innerHTML = remainingTimeForQuestion;
            remainingTimeForQuestion--;
            id("question-time-left").innerHTML = remainingTimeForQuestion;
            questionTimer = setTimeout(checkTimeforQuestion, 1000);
        }
    }

    classes("start-quiz")[0].addEventListener("click", () => {
        
        renderQuestion(quizChosen.data[questionNumber]);
        id("rules-box").style.display = "none";
        id("question-box").style.display = "block";

        id("quiz-time-left").innerHTML = remainingtimeForQuiz;
        quiztimer = setTimeout(checkTimeForQuiz, 1000);

        id("question-time-left").innerHTML = remainingTimeForQuestion;
        questionTimer = setTimeout(checkTimeforQuestion, 1000);
    });


    classes("next")[0].addEventListener("click", () => {
        if (questionNumber >= quizChosen.data.length) {
            clearInterval(quiztimer);
            console.log(questionAnswersGiven);
            sessionStorage.setItem("questionanswersGiven", questionAnswersGiven);
            window.location = "result.html";
        } else if (questionNumber === (quizChosen.data.length - 1)) {
            classes("next")[0].innerHTML = "Show Result";
            renderQuestion(quizChosen.data[questionNumber]);
            id("question-time-left").innerHTML = remainingTimeForQuestion;
            quiztimer = setTimeout(checkTimeforQuestion, 1000);
            classes("next")[0].classList.add("disabled");
            classes("submit")[0].classList.remove("disabled");

        } else {
            renderQuestion(quizChosen.data[questionNumber]);
            id("question-time-left").innerHTML = remainingTimeForQuestion;
            quiztimer = setTimeout(checkTimeforQuestion, 1000);
            classes("next")[0].classList.add("disabled");
            classes("submit")[0].classList.remove("disabled");

        }
    });

    classes("submit")[0].addEventListener("click", () => {
        let answerGiven = queryselector("input[name='answer']:checked");
        if (answerGiven) {
            answerGiven = answerGiven.value;
        }
        clearInterval(questionTimer);
        remainingTimeForQuestion = quizChosen.timePerQuestion;
        checkAnswer(answerGiven, quizChosen.data[questionNumber].answer, quizChosen.data[questionNumber].options);
        questionNumber++;

        classes("submit")[0].classList.add("disabled");
        classes("next")[0].classList.remove("disabled");
        
    });
}




window.addEventListener('load', () => {
    // reading parameters
    const params = (new URL(document.location)).searchParams;
    const quizChosen = params.get('quiz');
    // eval --> converting string to variable
    displayInitialData(eval(quizChosen));
});

Comments